home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / scsidrv.s < prev    next >
Text File  |  1999-12-19  |  5KB  |  218 lines

  1.     .include    iocscall.mac
  2.     .include    global.mac
  3.  
  4.   .ifndef _S_REVISION
  5. _S_REVISION    equ    $0A
  6.   .endif
  7.  
  8. ;----------------------------------------------------------------
  9. ;IOCS _SCSIDRVルーチン
  10. ;    _S_READ/_S_READEXTを自前で展開する
  11.     .text
  12.     .align    4,$2048
  13. scsidrv_routine::
  14.     cmp.l    #$21,d1            ;_S_READ
  15.     beq    s_read
  16.     cmp.l    #$26,d1            ;_S_READEXT
  17.     beq    s_readext
  18. call_old_scsidrv:
  19.     move.l    scsidrv_old_vector,-(sp)
  20.     rts
  21.  
  22.     .data
  23.     .align    4
  24. scsidrv_old_vector::    .dc.l    0
  25.  
  26. ;----------------------------------------------------------------
  27. ;_S_READ
  28. ;<d2.l:論理ブロック番号(2097151以下)
  29. ;<d3.l:転送ブロック数(255以下)
  30. ;<d4.l:ターゲットのSCSI-ID
  31. ;<d5.l:1ブロックのサイズ(0=256,1=512,2=1024)
  32. ;<a1.l:バッファの先頭アドレス
  33. ;>d0.l:
  34. ;    下位ワード    ステータスインフェーズの結果
  35. ;    上位ワード    メッセージインフェーズの結果
  36. ;    -1,-2        異常終了
  37.     .text
  38.     .align    4,$2048
  39. s_read:
  40.     tst.b    hard_soft        ;-hard/-softの指定がなければ古いルーチンを使う
  41.     bmi    call_old_scsidrv
  42.   .if TEST_SCSIDRV
  43.     move.w    #$03C0,$00E82200
  44.   .endif
  45.     st.b    scsicmd_in_progress
  46.     movem.l    d1-d4/a1,-(sp)
  47.     subq.l    #6,sp
  48.     and.l    #$000000FF,d3
  49.     beq    90f
  50.     lsl.l    #8,d3            ;転送ブロック数<<8
  51.     move.w    d3,(4,sp)        ;+4 転送ブロック数
  52.                     ;+5 コントロールバイト
  53.     and.l    #$001FFFFF,d2
  54.     move.l    d2,(sp)            ;+1 LUN,DPO,FUA,RelAdr
  55.                     ;+1~3 論理ブロック番号
  56.     move.b    #$08,(sp)        ;+0 オペレーションコード($08=Read)
  57.     moveq.l    #_S_SELECT,d1
  58.     bsr    call_old_scsidrv
  59.     tst.l    d0
  60.     beq    @f
  61.     moveq.l    #_S_SELECT,d1
  62.     bsr    call_old_scsidrv
  63.     tst.l    d0
  64.     bne    90f
  65. @@:
  66.     swap.w    d4
  67.     lsl.b    #5,d4
  68.     or.b    d4,(1,sp)        ;LUN
  69.     movea.l    sp,a1
  70.     moveq.l    #_S_CMDOUT,d1
  71.     bsr    call_old_scsidrv
  72.     tst.l    d0
  73.     bne    90f
  74.     lsl.l    d5,d3            ;転送バイト数
  75.     movea.l    (6+4*4,sp),a1        ;バッファの先頭アドレス(スタック注意)
  76.     moveq.l    #_S_DATAIN,d1
  77.     tst.b    hard_soft
  78.     beq    @f
  79.     moveq.l    #_S_DATAIN_P,d1
  80. @@:    bsr    call_old_scsidrv
  81.     move.l    d0,(sp)
  82.     beq    @f
  83.     cmp.l    #-2,d0
  84.     bne    90f
  85. @@:    clr.l    (4,sp)
  86.     lea.l    (4+3,sp),a1
  87.     moveq.l    #_S_STSIN,d1
  88.     bsr    call_old_scsidrv
  89.     tst.l    d0
  90.     bne    90f
  91.     lea.l    (4+1,sp),a1
  92.     moveq.l    #_S_MSGIN,d1
  93.     bsr    call_old_scsidrv
  94.     tst.l    d0
  95.     bne    90f
  96.     move.l    (4,sp),d0
  97.     bne    99f
  98.     move.l    (sp),d0
  99. 99:    addq.l    #6,sp
  100.     movem.l    (sp)+,d1-d4/a1
  101.     sf.b    scsicmd_in_progress
  102.   .if TEST_SCSIDRV
  103.     move.w    #$0000,$00E82200
  104.   .endif
  105.     tst.l    d0
  106.     rts
  107.  
  108. 90:    moveq.l    #-1,d0
  109.     bra    99b
  110.  
  111. ;----------------------------------------------------------------
  112. ;_S_READEXT
  113. ;<d2.l:論理ブロック番号
  114. ;<d3.l:転送ブロック数(65535以下)
  115. ;<d4.l:ターゲットのSCSI-ID
  116. ;<d5.l:1ブロックのサイズ(0=256,1=512,2=1024)
  117. ;<a1.l:バッファの先頭アドレス
  118. ;>d0.l:
  119. ;    下位ワード    ステータスインフェーズの結果
  120. ;    上位ワード    メッセージインフェーズの結果
  121. ;    -1,-2        異常終了
  122.     .text
  123.     .align    4,$2048
  124. s_readext:
  125.     tst.b    hard_soft        ;-hard/-softの指定がなければ古いルーチンを使う
  126.     bmi    call_old_scsidrv
  127.   .if TEST_SCSIDRV
  128.     move.w    #$001E,$00E82200
  129.   .endif
  130.     st.b    scsicmd_in_progress
  131.     movem.l    d1/d3-d4/a1,-(sp)
  132.     lea.l    (-10,sp),sp
  133.     and.l    #$0000FFFF,d3
  134.     beq    90f
  135.     lsl.l    #8,d3            ;転送ブロック数<<8
  136.     move.l    d3,(6,sp)        ;+6 reserved
  137.                     ;+7~8 転送ブロック数
  138.                     ;+9 コントロールバイト
  139.     move.l    d2,(2,sp)        ;+2~5 論理ブロック番号
  140.     move.w    #$28_00,(sp)        ;+0 オペレーションコード($28=ReadEXT)
  141.                     ;+1 LUN,DPO,FUA,RelAdr
  142.     moveq.l    #_S_SELECT,d1
  143.     bsr    call_old_scsidrv
  144.     tst.l    d0
  145.     beq    @f
  146.     moveq.l    #_S_SELECT,d1
  147.     bsr    call_old_scsidrv
  148.     tst.l    d0
  149.     bne    90f
  150. @@:
  151.     swap.w    d4
  152.     lsl.b    #5,d4
  153.     or.b    d4,(1,sp)        ;LUN
  154.     movea.l    sp,a1
  155.     moveq.l    #_S_CMDOUT,d1
  156.     bsr    call_old_scsidrv
  157.     tst.l    d0
  158.     bne    90f
  159.     lsl.l    d5,d3            ;転送バイト数
  160.     movea.l    (10+4*3,sp),a1        ;バッファの先頭アドレス(スタック注意)
  161.     moveq.l    #_S_DATAIN,d1
  162.     tst.b    hard_soft
  163.     beq    @f
  164.     moveq.l    #_S_DATAIN_P,d1
  165. @@:    bsr    call_old_scsidrv
  166.     move.l    d0,(sp)
  167.     beq    @f
  168.     cmp.l    #-2,d0
  169.     bne    90f
  170. @@:    clr.l    (4,sp)
  171.     lea.l    (4+3,sp),a1
  172.     moveq.l    #_S_STSIN,d1
  173.     bsr    call_old_scsidrv
  174.     tst.l    d0
  175.     bne    90f
  176.     lea.l    (4+1,sp),a1
  177.     moveq.l    #_S_MSGIN,d1
  178.     bsr    call_old_scsidrv
  179.     tst.l    d0
  180.     bne    90f
  181.     move.l    (4,sp),d0
  182.     bne    99f
  183.     move.l    (sp),d0
  184. 99:    lea.l    (10,sp),sp
  185.     movem.l    (sp)+,d1/d3-d4/a1
  186.     sf.b    scsicmd_in_progress
  187.   .if TEST_SCSIDRV
  188.     move.w    #$0000,$00E82200
  189.   .endif
  190.     tst.l    d0
  191.     rts
  192.  
  193. 90:    moveq.l    #-1,d0
  194.     bra    99b
  195.  
  196. ;----------------------------------------------------------------
  197.  
  198.   .if FORCE_CHANGE_SCSIDRV=0
  199. ;----------------------------------------------------------------
  200. ;IOCS _SCSIDRVのチェック
  201. ;    _S_REVISIONの結果が$000A未満かどうか確かめる
  202.     .text
  203.     .align    4,$2048
  204. scsidrv_check::
  205.     movem.l    d0-d1,-(sp)
  206.     SCSI    _S_REVISION
  207.     cmp.w    #$000A,d0
  208.     slo.b    old_scsidrv_flag    ;_SCSIDRVが古いときセット,新しければリセット
  209.     movem.l    (sp)+,d0-d1
  210.     rts
  211.  
  212.     .data
  213. old_scsidrv_flag:    .dc.b    0    ;-1=_SCSIDRVが古い
  214.  
  215. ;----------------------------------------------------------------
  216.   .endif
  217.  
  218.